#include"comm.h"
#include"menu.h"

//输入密码
void input_password(char *pw) 
{
    int i = 0;
    char c;
    system("stty -echo -icanon ");  

    fflush(stdout);

    while (1) 
    {
        read(STDIN_FILENO, &c, 1);

        if (c == '\n' || c == '\r') 
        {
            pw[i] = '\0';
            break;
        } 
        else if (c == 127 || c == 8) 
        {  
            if (i > 0) {
                i--;
                printf("\b \b");
                fflush(stdout);
            }
        } 
        else if (i < 32) 
        {
            pw[i++] = c;
            printf("*");
            fflush(stdout);
        }
    }

    system("stty echo icanon");  
    printf("\n");
}

// 定义清空缓冲区的函数
void clear_input_buffer() 
{
    int c;
    // 读取缓冲区所有残留字符，直到遇到换行符或文件结束
    while ((c = getchar()) != '\n' && c != EOF)
			;
}

// 验证IP是否为xxx.xxx.xxx.xxx格式，且每个段0-255
int ip_format(const char *ip) {
    if (ip == NULL) return 0;

    char *copy = strdup(ip);  
    if (copy == NULL) return 0;

    int segments = 0;
    char *token = strtok(copy, "."); 

    while (token != NULL) {
        segments++;
        // 检查每个段是否为纯数字
        for (int i = 0; token[i] != '\0'; i++) {
            if (token[i] < '0' || token[i] > '9') {
                free(copy);
                return 0;  
            }
        }
        // 检查段数值是否在0-255之间
        long val = atol(token);
        if (val < 0 || val > 255) {
            free(copy);
            return 0;  
        }
        // 检查段是否有前导零
        if (strlen(token) > 1 && token[0] == '0') {
            free(copy);
            return 0;  
        }
        token = strtok(NULL, ".");
    }

    free(copy);
    return (segments == 4) ? 1 : 0; 
}

// 读取字符串
void safe_gets(char *buf, int size) 
{
    // 确保缓冲区不为空且有足够空间
    if (buf == NULL || size <= 1) 
		return;
    
    // 使用fgets读取，最多读取size-1个字符
    if (fgets(buf, size, stdin) != NULL) {
        // 移除末尾的换行符
        int len = strlen(buf);
        if (len > 0 && buf[len - 1] == '\n') 
            buf[len - 1] = '\0';
        else 
        // 如果输入超过缓冲区大小，清空剩余内容
            clear_input_buffer();
    }
}


int welcome_menu(node_t * devlist,node_t * userlist)
{
	char choice;
	while(1)
	{
		system("clear");
		printf("╔══════════════════════════════════════════════════════╗\n");
    	printf("║                   Smart Living Hub                   ║\n");
    	printf("║                     ---Welcome---                    ║\n");
    	printf("╚══════════════════════════════════════════════════════╝\n");
		printf("╔══════════════════════════════════════════════════════╗\n");
    	printf("║                   1. Admin Login                     ║\n");
    	printf("║                   2. User  Login                     ║\n");
    	printf("║                   q. Exit                            ║\n");
    	printf("╚══════════════════════════════════════════════════════╝\n");
		
		scanf(" %c", &choice);
		switch (choice)
		{
		case '1':
			Alogin_menu(devlist, userlist);
			break;
		case '2':
			Ulogin_menu(devlist, userlist);
			break;
		case 'q':
		case 'Q':
			{
				system("clear");
				printf("Suer to save and exit(Y/Q/N)?\n");
				scanf(" %c", &choice);
				if (choice == 'y' || choice == 'Y')
				{
					save_devices(devlist);
					save_users(userlist);

					system("clear");
					printf("Bye!\n");
					return 0;
				}
				else if(choice == 'Q' || choice == 'q')
				{
					system("clear");
					printf("Bye!\n");
					return 0;
				}
				else
				{
					continue;
				}
			}
		default:
			printf("error input\n");
			break;
		}
	}		
}


int Alogin_menu(node_t * devlist,node_t * userlist)
{
	char account[16], password[16];
	int error_flag = 0, return_flag = 0;

	while (error_flag < LOOPCOUNT)
	{
		system("clear");
		// 标题区域
		printf("╔══════════════════════════════════════════════════════╗\n");
		printf("║                   Smart Living Hub                   ║\n");
		printf("║                   ---Admin Login---                  ║\n");
		printf("╚══════════════════════════════════════════════════════╝\n");

		// 主内容框
		printf("╔══════════════════════════════════════════════════════╗\n");
		printf("║                                                      ║\n");
		printf("║             ERROR TIMES:  %-2d                         ║\n", error_flag);
		printf("║                                                      ║\n");
		printf("║             Account:                                 ║\n");
		printf("║                                                      ║\n");
		printf("║             Password:                                ║\n");
		printf("║                                                      ║\n");
		printf("║             Tip: Input \"QUIT\" to exit                ║\n");
		printf("║                                                      ║\n");
		printf("╚══════════════════════════════════════════════════════╝\n");


		printf("\033[7A");  // 光标上移6行（定位到账号输入线）
		printf("║             Account: ");
		fflush(stdout);  	// 强制刷新输出，确保光标位置正确
		scanf("%s", account);
		clear_input_buffer();  
		if (strcmp(account, "QUIT") == 0)
		{
			return 0;
		}

		printf("\033[1B");  // 光标下移2行（定位到密码输入线）
		printf("║             Password: ");
		fflush(stdout);
		input_password(password);
		//clear_input_buffer();
		if (strcmp(password, "QUIT") == 0)
		{
			return 0;
		}

		printf("\033[5B");  // 光标下移5行（回到框外，避免遮挡）
		if (strcmp(account, ADMIN_NAME) != 0 || strcmp(password, ADMIN_PASS) != 0)
		{
			printf("╔══════════════════════════════════════════════════════╗\n");
			printf("║              Account or password error!              ║\n");
			printf("║             Press any key to continue...             ║\n");
			printf("╚══════════════════════════════════════════════════════╝\n");
			getchar();  
			error_flag++;
		}
		else
		{
			printf("\033[6A"); // 光标上移6行（回到顶部）
			admin_menu(devlist, userlist);
			return_flag = 1;
		}
		if (return_flag == 1)
		{
			return_flag = 0;
			return 0;
		}
	}
	return -1;
}


int admin_menu(node_t * devlist,node_t * userlist)
{
	char choice;
	while(1)
	{
		system("clear");
		printf("╔══════════════════════════════════════════════════════╗\n");
		printf("║                  Smart Living Hub                    ║\n");
		printf("║                     ---Admin---                      ║\n");
		printf("╚══════════════════════════════════════════════════════╝\n");
		printf("╔══════════════════════════════════════════════════════╗\n");
		printf("║        1.Add device            2.Delete device       ║\n");
		printf("║        3.Find device           4.Update device       ║\n");
		printf("║        5.Display device        6.Add user 	       ║\n");
		printf("║        7.Delete user           8.Display user        ║\n");
		printf("║        9.Find user             a.clear device        ║\n");
		printf("║        b.Control device        q.Quit                ║\n");
		printf("╚══════════════════════════════════════════════════════╝\n");
		scanf(" %c", &choice);
		switch (choice)
		{
		case '1':
			add_dev_menu(devlist);
			break;
		case '2':
			del_dev_menu(devlist);
			break;
		case '3':
			find_dev_menu(devlist);
			break;
		case '4':
			update_dev_menu(devlist);
			break;
		case '5':
			show_dev_menu(devlist);
			break;
		case '6':
			add_user_menu(userlist);
			break;
		case '7':
			del_user_menu(userlist);
			break;
		case '8':
			show_user_menu(userlist);
			break;
		case '9':
			find_user_menu(userlist);
			break;
		case 'A':
		case 'a':
			clear_dev_menu(devlist);
			break;
		case 'B':
		case 'b':
			control_dev_menu(devlist);
			break;
		case 'q':
		case 'Q':
			return 0;
			break;
		default:
			printf("error input\n");
			break;
		}
	}
}


int add_dev_menu(node_t * devlist)
{
	char choice;
	int error_flag = 0;
	device_t *device = malloc(sizeof(device_t));
	SYSERR(NULL,==,device,"malloc failed",-1);

	while(1)
	{
		system("clear");
		printf("╔══════════════════════════════════════════════════════╗\n");
		printf("║                  Smart Living Hub                    ║\n");
		printf("║                    ---ADD DEV---                     ║\n");
		printf("╚══════════════════════════════════════════════════════╝\n");
		printf("╔══════════════════════════════════════════════════════╗\n");
		printf("║                                                      ║\n");
		if(error_flag == 0)printf("║                       Adding...                      ║\n");
		else if(error_flag == 1)printf("║                   Name error                         ║\n");
		else if(error_flag == 2)printf("║                   Type error                         ║\n");
		else if(error_flag == 3)printf("║                   IPv4 error                         ║\n");	
		else if(error_flag == 4)printf("║                   Power error                        ║\n");	
		printf("║                                                      ║\n");
		printf("║                                                      ║\n");
		printf("║                                                      ║\n");
		printf("║                                                      ║\n");
		printf("║                                                      ║\n");
		printf("║                                                      ║\n");
		printf("║                                                      ║\n");
		printf("║                                                      ║\n");
		printf("║                                                      ║\n");
		printf("║                                                      ║\n");
		printf("║                                                      ║\n");
		printf("║                                                      ║\n");
		printf("╚══════════════════════════════════════════════════════╝\n");
		memset(device, 0, sizeof(device_t));  // 清空内存
											  //
		// 初始化
		clear_input_buffer();
		printf("\033[12A");  
		printf("║    Device Name: ");
		fflush(stdout);  	
		scanf("%s",device->dev_name);

		//验证数据
		if(!DEV_NAME_SURE(device->dev_name)){error_flag = 1;continue;}
		clear_input_buffer();
		printf("\033[1B"); 
		printf("║    Device Type: ");
		fflush(stdout);  	
		scanf("%s",device->dev_type);	
		if(!DEV_TYPE_SURE(device->dev_type)){error_flag = 2;continue;}
		clear_input_buffer();
		printf("\033[1B"); 
		printf("║    Device ip(192.168.x.x): ");
		fflush(stdout);  	
		scanf("%s",device->dev_ip);	
		if(!DEV_IP_SURE(device->dev_ip)){error_flag = 3;continue;}
		clear_input_buffer();
		printf("\033[1B");
		printf("║    Device power: ");
		scanf("%f",&device->power_ele);
		if(!DEV_POWER_SURE(device->power_ele)){error_flag = 4;continue;}
		clear_input_buffer();
		printf("\033[1B");
		printf("║    Describe: ");
		safe_gets(device->dev_desc, sizeof(device->dev_desc));

		
		printf("\033[1B");
		printf("║    Confirm to add(Y/N/Q)");
		scanf(" %c", &choice);
		switch (choice)
		{
		case 'Y':
		case 'y':
			device->dev_id = generate_id(); 	//ID
			device->dev_order = dev_count;		//序号
			device->dev_status = 0;				//状态
			device->cur_value = 0;				//当前值
			if(!add_dev(devlist, device))
			{
				// 显示结果	
				printf("\033[1B");
				clear_input_buffer();
				printf("╔══════════════════════════════════════════════════════╗\n");
				printf("║                   Add success!                       ║\n");
				printf("║             Press any key to return...               ║\n");
				printf("╚══════════════════════════════════════════════════════╝\n");
				getchar();
				return 0;	
			}
		case 'N':
		case 'n':
			error_flag = 0;
			continue;
		case 'Q':
		case 'q':
			free(device);
			return 0;
		default:
			continue;
		}
	}
	free(device);
	return 0;
}


int del_dev_menu(node_t * devlist)
{
	char choice,confirm;
	int delete_flag = 0,error_flag = 0;

	while (1)
	{
		system("clear");
		clear_input_buffer();
		printf("╔══════════════════════════════════════════════════════╗\n");
		printf("║                  Smart Living Hub                    ║\n");
		printf("║                  ---DELETE DEV---                    ║\n");
		printf("╚══════════════════════════════════════════════════════╝\n");
		printf("╔══════════════════════════════════════════════════════╗\n");
		printf("║                                                      ║\n");
		printf("║                  1.Delete By Id                      ║\n");
		printf("║                  2.Delete By Name                    ║\n");
		printf("║                  3.Delete By Type                    ║\n");
		printf("║                                                      ║\n");
		printf("║                  q.Quit                              ║\n");
		printf("║                                                      ║\n");
		printf("╚══════════════════════════════════════════════════════╝\n");
		
		scanf("%c", &choice);
		if(choice == 'q' || choice == 'Q')
			return 0;	
		else if(choice == '1' || choice == '2' || choice == '3')
		{
			system("clear");
			printf("╔═════════════════════════════════════════════════════╗\n");
			printf("║                  Smart Living Hub                   ║\n");
			printf("║                  ---DELETE DEV---                   ║\n");
			printf("╚═════════════════════════════════════════════════════╝\n");
			printf("╔═════════════════════════════════════════════════════╗\n");
            printf("║                                                     ║\n");
            printf("║                                                     ║\n");
            printf("║                                                     ║\n");
            printf("║                                                     ║\n");
			printf("║                                                     ║\n");
            printf("╚═════════════════════════════════════════════════════╝\n");

			device_t temp = {.dev_id = 0, .dev_name = "", .dev_type = ""};
			printf("\033[4A");  // 上移6行到输入位置
            if(choice == '1')printf("║             Input ID:");
			else if(choice == '2')printf("║             Input Name:");
			else if(choice == '3')printf("║             Input Type:");
            fflush(stdout);
			
			switch (choice)
            {
                case '1':
                    scanf("%d", &temp.dev_id);
					if(!DEV_ID_SURE(temp.dev_id))error_flag = 1;
                    break;
                case '2':
                    scanf("%s", temp.dev_name);
					if(!DEV_NAME_SURE(temp.dev_name))error_flag = 1;
                    break;
                case '3':
                    scanf("%s", temp.dev_type);
					if(!DEV_TYPE_SURE(temp.dev_type))error_flag = 1;
                    break;
                default:
                    break;
            }

			if(error_flag)
			{
				printf("\033[3B");
				clear_input_buffer();
				printf("╔══════════════════════════════════════════════════════╗\n");
				printf("║               Input error! Press any key...          ║\n");
				printf("╚══════════════════════════════════════════════════════╝\n");
				getchar();
				return -1;
			}
            
			clear_input_buffer();
            printf("\033[4B");  
            // 确认提示
            printf("╔══════════════════════════════════════════════════════╗\n");
            printf("║               Confirm to delete? (Y/N)               ║\n");
            printf("╚══════════════════════════════════════════════════════╝\n");
            printf("\033[2A");
			printf("║               Confirm to delete? (Y/N)");
            scanf(" %c", &confirm);
			printf("\033[1B");
			clear_input_buffer();

			switch (confirm)
            {
                case 'Y':
                case 'y':
                    {
						if (choice == '1')
                        	delete_flag = del_dev(devlist, cmpDev_ID, &temp);
						else if (choice == '2')
							delete_flag = del_dev(devlist, cmpDev_Name, &temp);
						else if (choice == '3')
							delete_flag = del_dev(devlist, cmpDev_Type, &temp);
						
						// 显示结果
						printf("╔══════════════════════════════════════════════════════╗\n");
						if (!delete_flag)
							printf("║                  Delete success!                     ║\n");
						else
							printf("║           No matching device found!                  ║\n");
						printf("║             Press any key to return...               ║\n");
						printf("╚══════════════════════════════════════════════════════╝\n");
						getchar();
						return delete_flag;
					}
                    
                case 'N':
                case 'n':
                    return 0;
                default:
                    printf("╔══════════════════════════════════════════════════════╗\n");
                    printf("║               Input error! Press any key...          ║\n");
                    printf("╚══════════════════════════════════════════════════════╝\n");
                    getchar();
                    return 0;
            }
		}
	}
}


int update_dev_menu(node_t * devlist)
{
	char choice,confirm;
	int tag_id;

	while(1)
	{
		system("clear");
		clear_input_buffer();
		printf("╔══════════════════════════════════════════════════════╗\n");
		printf("║                  Smart Living Hub                    ║\n");
		printf("║                  ---UPDATE DEV---                    ║\n");
		printf("╚══════════════════════════════════════════════════════╝\n");
		printf("╔══════════════════════════════════════════════════════╗\n");
		printf("║                                                      ║\n");
		printf("║                  1.Update dev Name                   ║\n");
		printf("║                  2.Update dev Type                   ║\n");
		printf("║                  q.Quit                              ║\n");
		printf("║                                                      ║\n");
		printf("╚══════════════════════════════════════════════════════╝\n");
		scanf("%c", &choice);
		if(choice == 'q' || choice == 'Q')
			return 0;	
		else if(choice == '1' || choice == '2' )
		{
			system("clear");
			printf("╔═════════════════════════════════════════════════════╗\n");
			printf("║                  Smart Living Hub                   ║\n");
			printf("║                  ---UPDATE DEV---                   ║\n");
			printf("╚═════════════════════════════════════════════════════╝\n");
			printf("╔══════════════════════════════════════════════════════╗\n");
			printf("║                                                      ║\n");
			printf("║                                                      ║\n");
			printf("║                                                      ║\n");
			printf("║                                                      ║\n");
			printf("║                                                      ║\n");
			printf("║                                                      ║\n");
			printf("║                                                      ║\n");
			printf("╚══════════════════════════════════════════════════════╝\n");
			clear_input_buffer();
			printf("\033[7A"); 
			printf("║    Input dev ID: ");
			fflush(stdout);  	
			scanf("%d",&tag_id);	

			device_t temp = {.dev_name = "",.dev_type = ""};
			printf("\033[1B");
			clear_input_buffer();
			switch(choice)
			{
				case '1':
				{
					printf("║    new dev Name: ");
					scanf("%s", temp.dev_name);
					break;
				}
				case '2':
				{
					printf("║    new dev Type: ");
					scanf("%s", temp.dev_type);
					break;
				}
			}
			clear_input_buffer();
			printf("\033[4B");  
			// 确认提示
			printf("╔══════════════════════════════════════════════════════╗\n");
			printf("║               Confirm to delete? (Y/N)               ║\n");
			printf("╚══════════════════════════════════════════════════════╝\n");
			printf("\033[2A");
			printf("║               Confirm to delete? (Y/N)");
			scanf(" %c", &confirm);
			printf("\033[1B");
		
			switch (confirm)
            {
                case 'Y':
                case 'y':
					if(update_dev(devlist,tag_id,atoi(&choice),&temp) != NULL)
					{
						// 显示结果	
						clear_input_buffer();
						printf("╔══════════════════════════════════════════════════════╗\n");
						printf("║                  Update success!                     ║\n");
						printf("║             Press any key to return...               ║\n");
						printf("╚══════════════════════════════════════════════════════╝\n");
						getchar();
						return 0;
					}
					else
					{
						// 显示结果	
						clear_input_buffer();
						printf("╔══════════════════════════════════════════════════════╗\n");
						printf("║                   Update error!                      ║\n");
						printf("║                                                      ║\n");
						printf("║             Press any key to return...               ║\n");
						printf("╚══════════════════════════════════════════════════════╝\n");
						getchar();
						return 0;
					}
				case 'N':
				case 'n':
					return 0;
			}
		}
		return 0;
	}
}


int show_dev_menu(node_t * devlist)
{
	char choice;
	while (1)
	{
		system("clear");
		printf("╔══════════════════════════════════════════════════════╗\n");
		printf("║                  Smart Living Hub                    ║\n");
		printf("║                  ---DISPLAY DEV---                   ║\n");
		printf("╚══════════════════════════════════════════════════════╝\n");
		printf("╔══════════════════════════════════════════════════════╗\n");
		printf("║                                                      ║\n");
		printf("║                    1.Sort By Id                      ║\n");
		printf("║                    2.Sort By Name                    ║\n");
		printf("║                    3.Sort By Type                    ║\n");
		printf("║                    4.Sort By Status                  ║\n");
		printf("║                    q.Quit                            ║\n");
		printf("║                                                      ║\n");
		printf("╚══════════════════════════════════════════════════════╝\n");

		scanf("%c", &choice);
		switch (choice)
		{
		case '1':
			sort_dev(devlist,cmpDev_ID);
			break;
		case '2':
			sort_dev(devlist,cmpDev_Name);
			break;
		case '3':
			sort_dev(devlist,cmpDev_Type);
			break;
		case '4':
			sort_dev(devlist,cmpDev_Status);
			break;
		case 'q':
		case 'Q':
			return 0;
			break;
		default:
			continue;
		}

		while (1)
		{
			system("clear");
			printf("╔══════════════════════════════════════════════════════╗\n");
			printf("║                  Smart Living Hub                    ║\n");
			printf("║                  ---DISPLAY DEV---                   ║\n");
			printf("╚══════════════════════════════════════════════════════╝\n");
			printf("═════════════════════════════════════════════════════════════════════════════════════════════════════════\n");
			show_dev(devlist,showDev_All);	
			printf("═════════════════════════════════════════════════════════════════════════════════════════════════════════\n");
			printf("\"Q/q\" to return to main menu\n");
			scanf("%c", &choice);
			if(choice == 'Q' || choice == 'q')
				break;
		}	
	}	
	return 0;
}


int find_dev_menu(node_t * devlist)
{
	char choice;
	int error_flag = 0;
	while (1)
	{
		system("clear");
		clear_input_buffer();
		printf("╔══════════════════════════════════════════════════════╗\n");
		printf("║                  Smart Living Hub                    ║\n");
		printf("║                   ---FIND DEV---                     ║\n");
		printf("╚══════════════════════════════════════════════════════╝\n");
		printf("╔══════════════════════════════════════════════════════╗\n");
		printf("║                                                      ║\n");
		printf("║                    1.Find By Id                      ║\n");
		printf("║                    2.Find By Name                    ║\n");
		printf("║                    3.Find By Type                    ║\n");
		printf("║                    4.Find By Status                  ║\n");
		printf("║                    q.Quit                            ║\n");
		printf("║                                                      ║\n");
		printf("╚══════════════════════════════════════════════════════╝\n");
		scanf("%c", &choice);
		if(choice == 'q' || choice == 'Q')
			return 0;	
		else if(choice == '1' || choice == '2' || choice == '3'|| choice == '4')
		{
			system("clear");
			clear_input_buffer();
			printf("╔═════════════════════════════════════════════════════╗\n");
			printf("║                  Smart Living Hub                   ║\n");
			printf("║                   ---FIND DEV---                    ║\n");
			printf("╚═════════════════════════════════════════════════════╝\n");
			device_t temp = {.dev_id = 0, .dev_name = "", .dev_type = "", .dev_status = -1};
			switch (choice)
            {
			case '1':
				{
					printf("input ID:\n");
					scanf("%d", &temp.dev_id);
					if(!DEV_ID_SURE(temp.dev_id))
					{error_flag = 1;break;}

					node_t *result = find_dev(devlist, cmpDev_ID,&temp);
					printf("════════════════════════════════════════════════════════════════════════════════════\n");
					if(result == NULL)
					{	
						printf("Not Found data!\n");
						clear_input_buffer();
						printf("\nPress any key to return\n");
						getchar();
						return -1;
					}
					show_dev(result,showDev_All);
					destroy_dlist(&result);
					break;
				}
			case '2':
				{
					printf("input name:\n");
						scanf("%s", temp.dev_name);
						if(!DEV_NAME_SURE(temp.dev_name))
						{error_flag = 1;break;}

						node_t *result = find_dev(devlist,cmpDev_Name,&temp);
						printf("════════════════════════════════════════════════════════════════════════════════════\n");
						if(result == NULL)
						{	
							printf("Not Found data!\n");
							clear_input_buffer();
							printf("\nPress any key to return\n");
							getchar();
							return -1;				
						}
						show_dev(result,showDev_All);
						destroy_dlist(&result);
						break;
					}
				case '3':
					{
						printf("input type:\n");
						scanf("%s", temp.dev_type);
						if(!DEV_TYPE_SURE(temp.dev_type))
						{error_flag = 1;break;}

						node_t *result = find_dev(devlist, cmpDev_Type,&temp);
						printf("════════════════════════════════════════════════════════════════════════════════════\n");
						if(result == NULL)
						{	
							printf("Not Found data!\n");
							clear_input_buffer();
							printf("\nPress any key to return\n");
							getchar();
							return -1;							
						}
						show_dev(result,showDev_All);
						destroy_dlist(&result);
						break;
					}
				case '4':
					{
						printf("input status:\n");
						scanf("%d", &temp.dev_status);
						if(temp.dev_status != 1 && temp.dev_status != 0)
						{error_flag = 1;break;}

						node_t *result = find_dev(devlist, cmpDev_Status,&temp);
						printf("════════════════════════════════════════════════════════════════════════════════════\n");
						if(result == NULL)
						{	
							printf("Not Found data!\n");
							clear_input_buffer();
							printf("\nPress any key to return\n");
							getchar();
							return -1;							
						}
						show_dev(result,showDev_All);
						destroy_dlist(&result);
						break;
					}
				default:
					printf("erorr choice\n");
                    continue; 
            }
			if(error_flag)
			{

				printf("input error!\n");
				clear_input_buffer();
				printf("\nPress any key to return\n");
				getchar();
				return -1;

			}

			printf("════════════════════════════════════════════════════════════════════════════════════\n");
            printf("\n\"Q/q\" to return\n");
            scanf(" %c", &choice);
			if (choice == 'q' || choice == 'Q')
			{
				return 0;
			}
			
		}
	}
}

//额外：设备相关
int clear_dev_menu(node_t *devlist)
{
	char answer[16];
	while (1)
	{
		system("clear");
		clear_input_buffer();
		printf("╔══════════════════════════════════════════════════════╗\n");
		printf("║                  Smart Living Hub                    ║\n");
		printf("║                   ---CLEAR DEV---                     ║\n");
		printf("╚══════════════════════════════════════════════════════╝\n");
		
		printf("Sure to clear all devices?(Admin password)\n");
		scanf("%s",answer);
		if(strcmp(answer,ADMIN_PASS) == 0)
		{
			printf("Sure to sure to clear?(Admin password)\n");
			clear_input_buffer();
			scanf("%s",answer);
			if(strcmp(answer,ADMIN_PASS) == 0)
			{
				clear_dev(devlist);
				clear_input_buffer();
				printf("╔══════════════════════════════════════════════════════╗\n");
				printf("║                  Clear success!                      ║\n");
				printf("║             Press any key to return...               ║\n");
				printf("╚══════════════════════════════════════════════════════╝\n");
				getchar();
				return 0;
			}
			
		}
		else 
			return -1;
	}
}

//复制设备
int copy_dev_menu(node_t *devlist)
{
	int tag_id;
	while (1)
	{
		system("clear");
		clear_input_buffer();
		printf("╔══════════════════════════════════════════════════════╗\n");
		printf("║                  Smart Living Hub                    ║\n");
		printf("║                   ---COPY DEV---                     ║\n");
		printf("╚══════════════════════════════════════════════════════╝\n");
		printf("╔══════════════════════════════════════════════════════╗\n");
		printf("║                                                      ║\n");
		printf("║                input \'0\' to return...                ║\n");
		printf("║                                                      ║\n");
		printf("║                                                      ║\n");
		printf("║                                                      ║\n");
		printf("╚══════════════════════════════════════════════════════╝\n");

		printf("\033[3A");  // 光标上移6行（定位到账号输入线）
		printf("║       the part is unfinished: ");
		fflush(stdout);  	// 强制刷新输出，确保光标位置正确
		scanf("%d",&tag_id);

		if(!DEV_ID_SURE(tag_id))
		{
			printf("\033[2B");
			clear_input_buffer();
			printf("╔══════════════════════════════════════════════════════╗\n");
			printf("║               Input error! Press any key...          ║\n");
			printf("╚══════════════════════════════════════════════════════╝\n");
			getchar();
			return -1;
		}
		/*
		else if(copy_dev(devlist,tag_id))
		{
			printf("\033[2B");
			clear_input_buffer();
			printf("╔══════════════════════════════════════════════════════╗\n");
			printf("║                   Copy success!                      ║\n");
			printf("║             Press any key to return...               ║\n");
			printf("╚══════════════════════════════════════════════════════╝\n");
			getchar();
			return 0;
		}
		*/
	}
}

//控制开关
int control_dev_menu(node_t *devlist)
{
	char choice;
	int tag_id;
	while (1)
	{
		system("clear");
		clear_input_buffer();
		printf("╔══════════════════════════════════════════════════════╗\n");
		printf("║                  Smart Living Hub                    ║\n");
		printf("║                 ---CONTORL DEV---                    ║\n");
		printf("╚══════════════════════════════════════════════════════╝\n");
		printf("╔══════════════════════════════════════════════════════╗\n");
		printf("║                                                      ║\n");
		printf("║                   0.close device                     ║\n");
		printf("║                   1.open  device                     ║\n");
		printf("║                   q.quit                             ║\n");
		printf("║                                                      ║\n");
		printf("╚══════════════════════════════════════════════════════╝\n");
		scanf("%c", &choice);
	
		if(choice == 'q' || choice == 'Q')
			return 0;
      	else if(choice ==  '0' || choice == '1')
		{
			system("clear");
			clear_input_buffer();
			printf("╔══════════════════════════════════════════════════════╗\n");
			printf("║                  Smart Living Hub                    ║\n");
			printf("║                 ---CONTORL DEV---                    ║\n");
			printf("╚══════════════════════════════════════════════════════╝\n");
			
			show_dev(devlist,showDev_All);
			printf("input id to open:\n");
			scanf("%d",&tag_id);
			
			if(control_dev(devlist,(atoi)(&choice),tag_id) != NULL)
			{
				clear_input_buffer();
				printf("╔══════════════════════════════════════════════════════╗\n");
				if(choice ==  '0')
					printf("║              close device success!                   ║\n");
				else if(choice ==  '1')
					printf("║              open device success!                    ║\n");
				printf("║             Press any key to continue...             ║\n");
				printf("╚══════════════════════════════════════════════════════╝\n");
				getchar();  
				return 0;
			}
			else 
			{
				clear_input_buffer();
				printf("╔══════════════════════════════════════════════════════╗\n");
				printf("║                  input ID error...                   ║\n");
				printf("║              or  device status change...             ║\n");
				printf("║             Press any key to continue...             ║\n");
				printf("╚══════════════════════════════════════════════════════╝\n");
				getchar();  
				return 0;	
			}
		}
	}
}

//额外：用户相关
int Ulogin_menu(node_t * devlist,node_t * userlist)
{
	users_t login = {.user_name = "", .user_pw = ""};
	int error_flag = 0, return_flag = 0;
	while (error_flag < LOOPCOUNT)
	{
		system("clear");
		// 标题区域
		printf("╔══════════════════════════════════════════════════════╗\n");
		printf("║                   Smart Living Hub                   ║\n");
		printf("║                   ---User Login---                   ║\n");
		printf("╚══════════════════════════════════════════════════════╝\n");

		// 主内容框
		printf("╔══════════════════════════════════════════════════════╗\n");
		printf("║                                                      ║\n");
		printf("║             ERROR TIMES:  %-2d                         ║\n", error_flag);
		printf("║                                                      ║\n");
		printf("║             Account:                                 ║\n");
		printf("║                                                      ║\n");
		printf("║             Password:                                ║\n");
		printf("║                                                      ║\n");
		printf("║             Tip: Input \"QUIT\" to exit                ║\n");
		printf("║                                                      ║\n");
		printf("╚══════════════════════════════════════════════════════╝\n");


		printf("\033[7A");  // 光标上移6行（定位到账号输入线）
		printf("║             Account: ");
		fflush(stdout);  	// 强制刷新输出，确保光标位置正确
		scanf("%s", login.user_name);
		clear_input_buffer();  

		if (strcmp(login.user_name, "QUIT") == 0)
		{
			return 0;
		}

		printf("\033[1B");  // 光标下移2行（定位到密码输入线）
		printf("║             Password: ");
		fflush(stdout);
		input_password(login.user_pw);

		printf("\033[5B");  // 光标下移5行（回到框外，避免遮挡）

		if (strcmp(login.user_pw, "QUIT") == 0)
		{
			return 0;
		}
		if (login_check(userlist, &login) != 0)
		{
			printf("╔══════════════════════════════════════════════════════╗\n");
			printf("║              Account or password error!              ║\n");
			printf("║             Press any key to continue...             ║\n");
			printf("╚══════════════════════════════════════════════════════╝\n");
			getchar();  
			error_flag++;
		}
		else
		{
			printf("\033[6A"); // 光标上移6行（回到顶部）
			user_menu(devlist, userlist);
			return_flag = 1;
		}
		if (return_flag == 1)
		{
			return_flag = 0;
			return 0;
		}
	}
	return -1;
}


int user_menu(node_t * devlist,node_t * userlist)
{
	char choice;
	while(1)
	{
		system("clear");
		printf("╔══════════════════════════════════════════════════════╗\n");
		printf("║                  Smart Living Hub                    ║\n");
		printf("║                     ---USER---                       ║\n");
		printf("╚══════════════════════════════════════════════════════╝\n");
		printf("╔══════════════════════════════════════════════════════╗\n");
		printf("║                 1.Display device                     ║\n");
		printf("║                 2.Find    device                     ║\n");
		printf("║                 3.Control device                     ║\n");
		printf("║                 q.Quit                               ║\n");
		printf("╚══════════════════════════════════════════════════════╝\n");
		scanf(" %c", &choice);
		switch (choice)
		{
		case '1':
			show_dev_menu(devlist);
			break;
		case '2':
			find_dev_menu(devlist);
			break;
		case '3':
			control_dev_menu(devlist);
			break;
		case 'q':
		case 'Q':
			return 0;
			break;
		default:
			printf("error input\n");
			break;
		}
	}
}


int add_user_menu(node_t *userlist)
{
	char choice;
	int error_flag = 0;
	users_t *user = malloc(sizeof(users_t));
	SYSERR(NULL,==,user,"malloc failed",-1);
	while(1)
	{
		system("clear");
		printf("╔══════════════════════════════════════════════════════╗\n");
		printf("║                  Smart Living Hub                    ║\n");
		printf("║                   ---ADD USER---                     ║\n");
		printf("╚══════════════════════════════════════════════════════╝\n");
		printf("╔══════════════════════════════════════════════════════╗\n");
		printf("║                                                      ║\n");
		if(error_flag == 0)printf("║                       Adding...                      ║\n");
		else if(error_flag == 1)printf("║                   Name error                         ║\n");
		else if(error_flag == 2)printf("║                   Password error                     ║\n");
		printf("║                                                      ║\n");
		printf("║                                                      ║\n");
		printf("║                                                      ║\n");
		printf("║                                                      ║\n");
		printf("║                                                      ║\n");
		printf("║                                                      ║\n");
		printf("║                                                      ║\n");
		printf("╚══════════════════════════════════════════════════════╝\n");
		memset(user, 0, sizeof(users_t));  // 清空内存
		// 初始化
		clear_input_buffer();
		printf("\033[7A");  
		printf("║    User Name: ");
		fflush(stdout);  	
		scanf("%s",user->user_name);
		if(!USER_NAME_SURE(user->user_name)){error_flag = 1;continue;}
		
		clear_input_buffer();
		printf("\033[1B"); 
		printf("║    User Password: ");
		fflush(stdout);  	
		scanf("%s",user->user_pw);	
		if(!USER_PW_SURE(user->user_pw)){error_flag = 2;continue;}

		printf("\033[1B");
		printf("║    Confirm to add(Y/N/Q)");
		scanf(" %c", &choice);
		switch (choice)
		{
		case 'Y':
		case 'y':
			user->user_id = generate_id_user(); 	//ID
			if(!add_user(userlist, user))
			{
				// 显示结果	
				printf("\033[2B");
				clear_input_buffer();
				printf("╔══════════════════════════════════════════════════════╗\n");
				printf("║                   Add success!                       ║\n");
				printf("║             Press any key to return...               ║\n");
				printf("╚══════════════════════════════════════════════════════╝\n");
				getchar();
				return 0;	
			}
			return 0;
		case 'N':
		case 'n':
			error_flag = 0;
			continue;
		case 'Q':
		case 'q':
			free(user);
			return 0;
		default:
			continue;
		}
	}
	free(user);
	return 0;
}

int del_user_menu(node_t *userlist)
{
	char choice,confirm;
	int delete_flag = 0,error_flag;

	while (1)
	{
		system("clear");
		clear_input_buffer();
		printf("╔══════════════════════════════════════════════════════╗\n");
		printf("║                  Smart Living Hub                    ║\n");
		printf("║                  ---DELETE DEV---                    ║\n");
		printf("╚══════════════════════════════════════════════════════╝\n");
		printf("╔══════════════════════════════════════════════════════╗\n");
		printf("║                                                      ║\n");
		printf("║                  1.Delete By Id                      ║\n");
		printf("║                  2.Delete By Name                    ║\n");
		printf("║                                                      ║\n");
		printf("║                  q.Quit                              ║\n");
		printf("║                                                      ║\n");
		printf("╚══════════════════════════════════════════════════════╝\n");
		
		scanf("%c", &choice);
		if(choice == 'q' || choice == 'Q')
			return 0;	
		else if(choice == '1' || choice == '2')
		{
			system("clear");
			printf("╔═════════════════════════════════════════════════════╗\n");
			printf("║                  Smart Living Hub                   ║\n");
			printf("║                  ---DELETE DEV---                   ║\n");
			printf("╚═════════════════════════════════════════════════════╝\n");
			printf("╔═════════════════════════════════════════════════════╗\n");
            printf("║                                                     ║\n");
            printf("║                                                     ║\n");
            printf("║                                                     ║\n");
            printf("║                                                     ║\n");
			printf("║                                                     ║\n");
            printf("╚═════════════════════════════════════════════════════╝\n");

			users_t temp = {.user_id = 0, .user_name = ""};
			printf("\033[4A");  // 上移6行到输入位置
            if(choice == '1')printf("║             Input ID:");
			else if(choice == '2')printf("║             Input Name:");
            fflush(stdout);
			
			switch (choice)
            {
                case '1':
                    scanf("%d", &temp.user_id);
					if(!USER_ID_SURE(temp.user_id))error_flag = 1;
                    break;
                case '2':
                    scanf("%s", temp.user_name);
					if(!USER_NAME_SURE(temp.user_name))error_flag = 1;
                    break;
                default:
                    break;
			}

			if(error_flag)
			{
				printf("\033[1B");
				clear_input_buffer();
				printf("╔══════════════════════════════════════════════════════╗\n");
				printf("║               Input error! Press any key...          ║\n");
				printf("╚══════════════════════════════════════════════════════╝\n");
				getchar();
				return -1;
			}

			clear_input_buffer();
			printf("\033[4B");  
			// 确认提示
			printf("╔══════════════════════════════════════════════════════╗\n");
			printf("║               Confirm to delete? (Y/N)               ║\n");
            printf("╚══════════════════════════════════════════════════════╝\n");
            printf("\033[2A");
			printf("║               Confirm to delete? (Y/N)");
            scanf(" %c", &confirm);
			printf("\033[1B");
			clear_input_buffer();
			switch (confirm)
            {
                case 'Y':
                case 'y':
                    {
						if (choice == '1')
                        	delete_flag = del_user(userlist, cmpUser_ID, &temp);
						else if (choice == '2')
							delete_flag = del_user(userlist, cmpUser_Name, &temp);

						// 显示结果
						printf("╔══════════════════════════════════════════════════════╗\n");
						if (!delete_flag)
							printf("║                  Delete success!                     ║\n");
						else
							printf("║           No matching device found!                  ║\n");
						printf("║             Press any key to return...               ║\n");
						printf("╚══════════════════════════════════════════════════════╝\n");
						getchar();
						return delete_flag;
					}
                case 'N':
                case 'n':
                    return 0;
                default:
                    printf("╔══════════════════════════════════════════════════════╗\n");
                    printf("║               Input error! Press any key...          ║\n");
                    printf("╚══════════════════════════════════════════════════════╝\n");
					getchar();
					return 0;
			}
		}
	}
}

int find_user_menu(node_t *userlist)
{
	char choice;
	while (1)
	{
		system("clear");
		clear_input_buffer();
		printf("╔══════════════════════════════════════════════════════╗\n");
		printf("║                  Smart Living Hub                    ║\n");
		printf("║                  ---FIND USER---                     ║\n");
		printf("╚══════════════════════════════════════════════════════╝\n");
		printf("╔══════════════════════════════════════════════════════╗\n");
		printf("║                                                      ║\n");
		printf("║                    1.Find By Id                      ║\n");
		printf("║                    2.Find By Name                    ║\n");
		printf("║                    q.Quit                            ║\n");
		printf("║                                                      ║\n");
		printf("╚══════════════════════════════════════════════════════╝\n");
		scanf("%c", &choice);
		if(choice == 'q' || choice == 'Q')
			return 0;	
		else if(choice == '1' || choice == '2' )
		{
			system("clear");
			clear_input_buffer();
			printf("╔═════════════════════════════════════════════════════╗\n");
			printf("║                  Smart Living Hub                   ║\n");
			printf("║                  ---FIND USER---                    ║\n");
			printf("╚═════════════════════════════════════════════════════╝\n");
			users_t temp = {.user_id = 0, .user_name = "", .user_pw = ""};
			switch (choice)
            {
			case '1':
				{
					printf("input ID:\n");
					scanf("%d", &temp.user_id);
					if(!USER_ID_SURE(temp.user_id))
					{
						printf("\033[1B");
						clear_input_buffer();
						printf("╔══════════════════════════════════════════════════════╗\n");
						printf("║                 ID input error...                    ║\n");
						printf("║             Press any key to return...               ║\n");
						printf("╚══════════════════════════════════════════════════════╝\n");
						getchar();
						return 0;	
					}
					node_t *result = find_user(userlist, cmpUser_ID,&temp);
					printf("════════════════════════════════════════════\n");
					if(result == NULL)
					{	
						printf("Not Found data!\n");
						clear_input_buffer();
						printf("\nPress any key to return\n");
						getchar();
						return -1;
					}
					show_users(result,showUser_All);
					destroy_dlist(&result);
					break;
				}
			case '2':
				{
					printf("input name:\n");
					scanf("%s", temp.user_name);
					if(!USER_NAME_SURE(temp.user_name))
					{
						printf("\033[1B");
						clear_input_buffer();
						printf("╔══════════════════════════════════════════════════════╗\n");
						printf("║                Name input error...                   ║\n");
						printf("║             Press any key to return...               ║\n");
						printf("╚══════════════════════════════════════════════════════╝\n");
						getchar();
						return 0;	
					}
					node_t *result = find_user(userlist,cmpUser_Name,&temp);
					printf("════════════════════════════════════════════\n");
						if(result == NULL)
						{	
							printf("Not Found data!\n");
							clear_input_buffer();
							printf("\nPress any key to return\n");
							getchar();
							return -1;				
						}
						show_users(result,showUser_All);
						destroy_dlist(&result);
						break;
				}
                default:
                    printf("erorr choice\n");
                    continue; 
            }
			printf("════════════════════════════════════════════\n");
            printf("\n\"Q/q\" to return\n");
            scanf(" %c", &choice);
			if (choice == 'q' || choice == 'Q')
			{
				continue;
			}
			
		}
	return 0;
	}
}

int show_user_menu(node_t *userlist)
{
	char choice;
	while (1)
	{
		system("clear");
		printf("╔══════════════════════════════════════════════════════╗\n");
		printf("║                  Smart Living Hub                    ║\n");
		printf("║                 ---DISPLAY USER---                   ║\n");
		printf("╚══════════════════════════════════════════════════════╝\n");
		printf("╔══════════════════════════════════════════════════════╗\n");
		printf("║                                                      ║\n");
		printf("║                    1.Sort By Id                      ║\n");
		printf("║                    2.Sort By Name                    ║\n");
		printf("║                    q.Quit                            ║\n");
		printf("║                                                      ║\n");
		printf("╚══════════════════════════════════════════════════════╝\n");
		scanf("%c", &choice);
		switch (choice)
		{
			case '1':
				sort_users(userlist,cmpUser_ID);
				break;
			case '2':
				sort_users(userlist,cmpUser_Name);
				break;
			case 'q':
			case 'Q':
				return 0;
				break;
			default:
				continue;
		}
		while (1)
		{
			system("clear");
			printf("╔══════════════════════════════════════════════════════╗\n");
			printf("║                  Smart Living Hub                    ║\n");
			printf("║                 ---DISPLAY USER---                   ║\n");
			printf("╚══════════════════════════════════════════════════════╝\n");
			printf("══════════════════════════════════\n");
			show_users(userlist,showUser_All);	
			printf("══════════════════════════════════\n");
			printf("\"Q/q\" to return to main menu\n");
			scanf("%c", &choice);
			if(choice == 'Q' || choice == 'q')
				break;
		}	
	}
	return 0;
}


